package lu.med.praxiswahl.wahlumed.client.formdesigner;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;

import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * 
 * @author Lars Holger Roth
 */
@SuppressWarnings("serial")
public class FormDesignerViewPanel extends JPanel implements MouseListener,
	Printable
{

    public static int FORMAT_A4 = 0;
    private FormDesignerModel model;
    private double pageWidth, pageHeight;
    private Image background;

    public FormDesignerViewPanel(FormDesignerModel model)
    {
	// Das Panel lädt die Grafik im 1:1 Format und nimmt
	// Mausklicks an. Nach einem Mausklick wird ein neues
	// Positionsobjekt im Modell angelegt und der List
	// View über die Änderung informiert
	// Das Panel geht immer davona us, dass die Grafik mit 300 dpi
	// gescannt wurde
	// A4 wird als Standard Format angenommen
	this.setLayout(null);
	this.addMouseListener(this);
	this.model = model;
	setToFormat(FORMAT_A4);
	this.setPreferredSize(new Dimension((int) pageWidth, (int) pageHeight));
    }

    public void loadImage(String fileName)
    {
	background = Toolkit.getDefaultToolkit().getImage(fileName);
	this.repaint();
    }

    public void mouseClicked(MouseEvent e)
    {
	// Ein Klick führt zum hinzufügen eines neuen Objektes an
	// der entsprechenden Position
	String input = JOptionPane
		.showInputDialog("Geben Sie den Bezeichner ein :");
	if (!input.equals(""))
	{
	    model.createObjectPosition(input, e.getX() / 2, e.getY() / 2);
	}
    }

    public void mouseEntered(MouseEvent e)
    {
    }

    public void mouseExited(MouseEvent e)
    {
    }

    public void mousePressed(MouseEvent e)
    {
    }

    public void mouseReleased(MouseEvent e)
    {
    }

    @Override
    public void paint(Graphics g)
    {
	super.paint(g);
	// Zeichnet die Hintergrund Grafik ein
	if (background != null)
	{
	    // Falls eine Grafik geladen wurde, so wird diese
	    // angezeigt
	    g.drawImage(background, 0, 0, (int) pageWidth, (int) pageHeight,
		    this);
	}
    }

    public int print(Graphics g, PageFormat pageFormat, int pageIndex)
	    throws PrinterException
    {
	if (pageIndex >= 1)
	{
	    return Printable.NO_SUCH_PAGE;
	}
	g.setFont(new Font("Times New Roman", Font.BOLD, 12));
	g.setColor(new Color(0, 0, 0));

	// Druckt alle Elemente
	ArrayList<FormDesignerObject> o = model.getObjects();

	int x, y;
	String d;

	for (int i = 0; i < o.size(); i += 2)
	{
	    if (i >= o.size())
		break;
	    x = o.get(i).getPos();
	    y = o.get((i + 1)).getPos();
	    d = o.get(i).getDescription();
	    g.drawString(d, x, y);
	}

	return Printable.PAGE_EXISTS;
    }

    public void printTest()
    {
	// Druckt alle Onjekte ohne die Hintergrund Grafik
	PrinterJob pj = PrinterJob.getPrinterJob();
	boolean ret = pj.printDialog();
	if (ret)
	{
	    pj.setPrintable(this);
	    try
	    {
		pj.setJobName("TestDruck");
		// pj.setCopies(1);
		pj.print();
	    }
	    catch (PrinterException p)
	    {
		JOptionPane.showMessageDialog(null,
			"Es trat ein Fehler beim Drucken auf.");
	    }
	}
    }

    public void setToFormat(int format)
    {
	// Setzt die Maße des Panels auf die passende Größe,
	// damit Positionen 1:1 abgelesen werden können
	if (format == FORMAT_A4)
	{
	    pageWidth = 21.0 * 30.0 * 2; // 21.0 / 2.54 * 120.0;
	    pageHeight = 29.7 * 30 * 2; // 29.7 / 2.54 * 120.0;
	}
    }
}
